import localForage from 'localforage/src/localforage';
import $http from './http/interface.js';
import store from '../store/index.js'
export default {
	config: {
		lockReconnect: false, // 避免重复连接
		timeout: 30000, // 30秒一次心跳
		timeoutObj: null, // 心跳倒计时
		serverTimeoutObj: null, // 等待服务器响应延时器
		timeoutnum: null, // 断开 重连倒计时
	},
	lockReconnect: false, // 避免重复连接
	timeout: 30000, // 30秒一次心跳
	timeoutObj: null, // 心跳倒计时
	serverTimeoutObj: null, // 等待服务器响应延时器
	timeoutnum: null, // 断开 重连倒计时
	// 重新连接
	reconnect (vm, whichVue) {
	  console.log('重新连接 - reconnect');
		if (this.lockReconnect) {
			return;
		}
		this.lockReconnect = true;
		// 没连接上会一直重连，设置延迟避免请求过多
		this.timeoutnum && clearTimeout(this.timeoutnum);
		this.timeoutnum = setTimeout(() => {
			// 新连接
			this.doSocket(vm, whichVue, true);
			this.lockReconnect = false;
		}, 5000);
	},
	// 重置心跳
	reset (vm, whichVue) {
		console.log('重置心跳 - reset');
		// 清除时间
		clearTimeout(this.timeoutObj);
		clearTimeout(this.serverTimeoutObj);
		// 重启心跳
		this.start(vm, whichVue);
	},
	// 开启心跳
	start (vm, whichVue) {
		console.log('开启心跳 - start');
		console.log('计时器：', this.timeoutObj, this.serverTimeoutObj);
		this.timeoutObj && clearTimeout(this.timeoutObj);
		this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
		
		this.timeoutObj = setTimeout(() => {
		  // 这里发送一个心跳，后端收到后，返回一个心跳消息，
			let socketTask = store.state.socketTask;
			console.log(socketTask, 'socketTask.readyState = ', socketTask.readyState);
			if (socketTask.readyState === 1) { // 如果连接正常
				uni.sendSocketMessage({
					data: JSON.stringify({type: 'HEART_BEAT'}),
					success: (res) => {
						console.log('心跳发射成功，res: ', res);
					}
				});
		    // socketTask.send(JSON.stringify({type: 'HEART_BEAT'}));
		  } else { // 否则重连
		    this.reconnect(vm, whichVue);
		  }
		  // 定义一个延时器等待服务器响应，若超时，则关闭连接，重新请求server建立socket连接
		  this.serverTimeoutObj = setTimeout(() => { // 超时关闭
		    socketTask.close();
		  }, 5000);
		}, this.timeout);
	},
	/**
	 * socket 连接 一系列操作(包括收到消息后的默认操作-App.vue, 其他页面重设后会改变)
	 * @param {Object} vm
	 * 需要vue页面必须有:
	 * 字段: computed: msgUrl / chatList / userInfo / socketUrl
	 * 方法: methods: setSocketTask / setSocketOpen / setHadRegister / setChatList
	 */
	async doSocket (vm, whichVue, newLink = false) {
		console.log('进入doSocket方法' , 1);
		if (newLink || store.state.socketTask == null) {
			await this.getChatList(vm);
			console.log('userInfo：', vm.userInfo);
			let socketTask = uni.connectSocket({
				url: vm.socketUrl,
				complete: (res) => {
					console.log('complete: ', res)
				}
			});
			uni.onSocketOpen((res) => {
				vm.setSocketOpen(true);
				console.log('WebSocket连接已打开！res: ', res);
				this.doRegister(vm);
				// 开启心跳
				this.start(vm, whichVue);
				console.log('onSocketOpen - 开启心跳');
			});
			uni.onSocketError((res) => {
				// vm.setSocketOpen(false);
				// vm.setHadRegister(false);
				console.log('WebSocket连接打开失败，请检查！res: ', res);
				// 重连
				this.reconnect(vm, whichVue);
				console.log('onSocketError - 重连心跳');
			});
			uni.onSocketMessage((res) => {
				let list = JSON.parse(res.data);
				if (list instanceof Array) { // 心跳包不是数组
					if (whichVue) {
						this.gotMessage(whichVue, list, vm.userInfo.userId, vm);
					} else {
						let currentPath = vm.$route.path;
						
						let which = '';
						let pages = getCurrentPages();
						let curPage = pages[pages.length - 1];
						let that = curPage;
						if (currentPath === '/pages/msg/chat/chat') {
							which = 'chat';
							console.log('App - 收到服务器内容 from 聊天界面 chat：', res);
						} else if (currentPath === '/pages/news/newsComPage') {
							which = 'allNotice';
							console.log('App - 收到服务器内容 from 发现界面 newsComPage：', res);
						} else if (currentPath === '/pages/msg/notice') {
							which = 'notice';
							console.log('App - 收到服务器内容 from 系统通知界面 notice：', res);
						} else if (currentPath === '/pages/msg/notice2') {
							which = 'notice2';
							console.log('App - 收到服务器内容 from 征订需求界面 notice2：', res);
						} else if (currentPath === '/pages/msg/discount') {
							which = 'coupon';
							console.log('App - 收到服务器内容 from 优惠促销界面 coupon：', res);
						} else if (currentPath === '/pages/msg/chat/chatList') {
							which = 'chatList';
							console.log('App - 收到服务器内容 from 客服列表界面 chatList(暂无)：', res);
						} else if (currentPath === '/pages/trends/messages') {
							which = 'trendMessages';
							console.log('App - 收到服务器内容 from 动态消息列表界面 messages：', res);
						} else if (currentPath === '/pages/trends/detail') {
							which = 'trendDetail';
							console.log('App - 收到服务器内容 from 动态详情界面 messages：', res);
						} else if (currentPath === '/pages/question/messages') {
							which = 'questionMessages';
							console.log('App - 收到服务器内容 from 动态消息列表界面 messages：', res);
						} else if (currentPath === '/pages/question/detail') {
							which = 'questionDetail';
							console.log('App - 收到服务器内容 from 动态详情界面 messages：', res);
						} else {
							which = '';
							that = vm;
							console.log('App - 收到服务器内容 from 其他：', res);
						}
						console.log(pages, curPage, currentPath, which);
						this.gotMessage(which, list, vm.userInfo.userId, that);
					}
				} else {
					console.log('接收到的心跳：', list);
				}
				// 收到服务器信息，心跳重置
				this.reset(vm, whichVue);
				console.log('onSocketMessage - 心跳重置');
			});
			uni.onSocketClose((res) => {
				// this.socketOpen = false;
				// vm.setSocketOpen(false);
				// vm.setHadRegister(false);
				console.log('WebSocket 已关闭！res: ', res);
				// 重连
				this.reconnect(vm, whichVue);
				console.log('onSocketClose - 重连心跳');
			});
			store.commit('setSocketTask', socketTask);
			console.log(1, store.state.socketTask);
		}
		
	},
	
	
	/**
	 * socket注册
	 * @param {Object} vm
	 * 需要vue页面必须有:
	 * 字段: computed: userInfo 
	 * 方法: methods: setHadRegister
	 */ 
	doRegister (vm) {
		if (vm.userInfo && vm.userInfo.userId) {
			console.log({
				loginName: vm.userInfo.userId,
				type: 'REGISTER'
			});
			uni.sendSocketMessage({
				data: JSON.stringify({
					loginName: vm.userInfo.userId,
					type: 'REGISTER'
				}),
				success: (res) => {
					console.log('websocket注册成功，res: ', res);
					vm.setHadRegister(true);
				},
				fail: (res) => {
					vm.setHadRegister(false);
				}
			});
		}
	},
	/**
	 * 查询客服列表
	 * @param {Object} vm
	 * 需要vue页面必须有:
	 * 字段: computed: msgUrl / chatList
	 * 方法: methods: setChatList
	 */ 
	async getChatList (vm, bool, chatListParam) {
		console.log('进入getChatList: ', 2);
		await $http.post('/msg/getCustomerService', null, {
			baseUrl: vm.msgUrl,
		}).then((res) => {
			console.log('进入getChatList的接口: ', 3);
			if (res.data.data && res.data.data.length) {
				let chatList = [];
				for (let v of res.data.data) {
					chatList.push({
						uid: v.id,
						username: v.userName,
						face: v.shopImage,
						_msgNum: 0
					})
				}
				vm.setChatList(chatList);
				if (bool) {
					vm[chatListParam] = chatList;
				}
			}
		}).catch(error => console.log(error));
		console.log('准备退出getChatList: ', 4);
	},
	/**
	 * 收到的消息的处理: 根据页面判断哪些直接展示,哪些需要缓存,以及消息数量提示
	 * @param {Object} which 页面(chat/allNotice/notice/notice2/coupon/chatList/trendMessages)
	 * @param {Object} res 获取到的消息,数组字符串
	 * @param {Object} userId
	 * @param {Object} vm 当前页面对象
	 */
	async gotMessage (which, list, userId, vm) {
		if (list.length > 0) {
			let sysnoticeList = [],
				couponList = [],
				printmsgList = [],
				p2pList = [],
				trendsList = [],
				questionList = [];
			for (let obj of list) {
				let v = JSON.parse(obj);
				if (v.msgType === 'p2p') {
					p2pList.push({
						id: v.message.id,
						uid: v.message.uid,
						username: v.message.username,
						face: v.message.face || 1,
						time: v.message.time,
						type: v.message.type,
						msg: v.message.msg,
						isSelf: false // 为false表示接收的别人发来的消息，用于获取历史聊天对象list时，头像昵称等要获取时对应的属性名（为false时正常取uid、username、face，为true时则取对应带2结尾的属性名，表示发送给别人这个人的信息）
					});
				} else if (v.msgType === 'sysnotice') { // 系统通知消息
					let t = JSON.parse(v.message);
					sysnoticeList.push(t);
				} else if (v.msgType === 'coupon') { // 优惠劵 ，广告 等消息
					let t = JSON.parse(v.message);
					couponList.push(v.message);
				} else if (v.msgType === 'printmsg') { // 征订需求消息
					let t = JSON.parse(v.message);
					let spec = JSON.parse(t.CommoditySpec);
					let str = '';
					for (let x in spec) {
						str += `${x}: ${spec[x]} `;
					}
					t['CommoditySpec'] = str;
					printmsgList.push(t);
				} else if (v.msgType === 'trends') { // 动态 - 点赞+评论
					trendsList.push(v.message);
				} else if (v.msgType === 'question') { // 动态 - 解答+回复
					questionList.push(v.message);
				}
			}
			if (p2pList.length > 0) {
				console.group('socketCom - p2pList')
				for (let v of p2pList) {
					if (which === 'chat') { // 聊天页面, 页面展示新消息
						vm.screenMsg(v);
					} else {
						if (which === 'allNotice') { // 发现页面: 修改对应某个客服消息的数字角标
							vm.setMsgDot(v);
						}
						await this.doLocalForageOutline(v, v.uid, userId); // 非聊天页面,存储未读消息
					}
					await this.doLocalForage(v, v.uid, userId); // 存储聊天消息
				}
				if (which === 'allNotice') { // 发现页面: 修改消息navbar的数字角标值
					vm.setNavDot(p2pList.length);
				}
				console.groupEnd();
			}
			if (sysnoticeList.length > 0) {
				for (let v of sysnoticeList) {
					if (which === 'notice') { // "系统通知"页面: 页面展示新通知
						vm['list'].push(v);
					} else {
						if (which === 'allNotice') { // 发现页面: 修改"系统通知"菜单的个数, 从而改变数字角标值
							vm['sysnoticeList'].push(v);
						}
						await this.doLocalForageOutline2(v, 1, userId); // 非"系统通知"页面, 存储未读消息
					}
					await this.doLocalForage2(v, 1, userId); // 存储通知消息
				}
				if (which === 'allNotice') { // 发现页面: 修改消息navbar的数字角标值
					vm.setNavDot(sysnoticeList.length);
				}
			}
			if (couponList.length > 0) {
				for (let v of couponList) {
					if (which === 'coupon') { // "优惠券"页面: 页面展示新通知
						vm['list'].push(v);
					} else {
						if (which === 'allNotice') { // 发现页面: 修改"优惠券"菜单的个数, 从而改变数字角标值
							vm['couponList'].push(v);
						}
						await this.doLocalForageOutline2(v, 3, userId); // 非"优惠券"页面, 存储未读消息
					}
					await this.doLocalForage2(v, 3, userId); // 存储通知消息
				}
				if (which === 'allNotice') { // 发现页面: 修改消息navbar的数字角标值
					vm.setNavDot(couponList.length);
				}
			}
			if (printmsgList.length > 0) {
				for (let v of printmsgList) {
					if (which === 'notice2') { // "征订需求"页面: 页面展示新通知
						vm['list'].push(v);
					} else {
						if (which === 'allNotice') { // 发现页面: 修改"征订需求"菜单的个数, 从而改变数字角标值
							vm['printmsgList'].push(v);
						}
						await this.doLocalForageOutline2(v, 2, userId); // 非"征订需求"页面, 存储未读消息
					}
					await this.doLocalForage2(v, 2, userId); // 存储通知消息
				}
				if (which === 'allNotice') { // 发现页面: 修改消息navbar的数字角标值
					vm.setNavDot(printmsgList.length);
				}
			}
			if (trendsList.length > 0) {
				for (let v of trendsList) {
					await this.doLocalForageOutline2(v, 4, userId); // 不管当前页面, 存储评论点赞的消息,都是未读
				}
				if (which === 'allNotice') { // 发现页面: 修改动态navbar的数字角标值
					vm.setTrendNavDot(trendsList.length);
				}
			}
			if (questionList.length > 0) {
				for (let v of questionList) {
					await this.doLocalForageOutline2(v, 5, userId); // 不管当前页面, 存储评论点赞的消息,都是未读
				}
				if (which === 'allNotice') { // 发现页面: 修改动态navbar的数字角标值
					vm.setQuestionNavDot(questionList.length);
				}
			}
			if (which !== 'chat') { // 在非聊天界面, TabBar的数字角标值 + 聊天数量
				vm.setUnreadMsg(vm.unreadMsg + p2pList.length);
			}
			if (which !== 'notice') { // 在非"系统通知"界面, TabBar的数字角标值 + 系统通知数量
				vm.setUnreadMsg(vm.unreadMsg + sysnoticeList.length);
			}
			if (which !== 'notice2') { // 在非"征订需求"界面, TabBar的数字角标值 + 征订需求数量
				vm.setUnreadMsg(vm.unreadMsg + printmsgList.length);
			}
			if (which !== 'coupon') { // 在非"优惠券"界面, TabBar的数字角标值 + 优惠券数量
				vm.setUnreadMsg(vm.unreadMsg + couponList.length);
			}
			// if (which !== 'trendMessages') { // 在非"动态消息列表"界面, TabBar的数字角标值 + 动态消息数量
			// 	vm.setUnreadMsg(vm.unreadMsg + trendsList.length);
			// }
			// 目前即使在"动态消息列表"界面,新收到的消息还未展示,是存储在本地,所以TabBar的数字角标值也需要变化
			if (trendsList.length > 0) {
				vm.setUnreadMsg(vm.unreadMsg + trendsList.length);
			}
			if (questionList.length > 0) {
				vm.setUnreadMsg(vm.unreadMsg + questionList.length);
			}
			let app = document.getElementById('app');
			let b=document.getElementById('bgMusic');
			if (b) {
				app.removeChild(b);
			}
			// 语音提示消息
			let $audio = document.createElement('audio');
			$audio.setAttribute('src', './static/voice/message.mp3');
			$audio.setAttribute('id', 'bgMusic');
			$audio.setAttribute('autoplay', true);
			app.appendChild($audio);
			app.removeChild($audio);
			document.body.appendChild(audio);
		}
	},
	/**
	 * 存储聊天消息
	 * 不区分是否已读, 页面展示: 存储到本地 - 所有 "聊天消息" (mgsAllIds)
	 * @param {Object} obj 要存储的某条信息
	 * @param {Object} fromId 聊天对象的id
	 * @param {Object} userId 本人id
	 */
	async doLocalForage(obj, fromId, userId) {
		let indexDBMsgList = [];
		let msgAllIds = [];
		localForage.getItem('mgsAllIds').then((value) => {
			if (value) {
				msgAllIds = value;
			}
			if (msgAllIds.indexOf(`${fromId},${userId}`) === -1) {  // 存储新的聊天对象
				msgAllIds.push(`${fromId},${userId}`);
				localForage.setItem('mgsAllIds', msgAllIds);
			}
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
		await localForage.getItem(`${fromId},${userId}`).then((value) => { // 获取已存储的聊天内容,再加入新的聊天信息
			// 当离线仓库中的值被载入时，此处代码运行
			// console.log('indexDBMsgList: ', value);
			if (value && value.length > 0) {
				indexDBMsgList = value;
			}
			indexDBMsgList.push(obj);
			localForage.setItem(`${fromId},${userId}`, indexDBMsgList).then((value) => {
				// 当值被存储后，可执行其他操作
				// console.log(value);
			}).catch((err) => {
				// 当出错时，此处代码运行
				console.log(err);
			});
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
	},
	/**
	 * 存储其他消息
	 * 不区分是否已读, 页面展示: 存储到本地 - 除聊天消息外的 "其他消息"
	 * @param {Object} obj 要存储的某条信息
	 * @param {Object} type 区分哪种消息 [ 1 - 系统；2 - 征订；3 - 优惠； ]
	 * @param {Object} userId 本人id
	 */
	async doLocalForage2 (obj, type = 1, userId) {
		let indexDBMsgList = [];
		let keyStr = `${userId}_notices`;
		if (type === 2) {
			keyStr = `${userId}_overprintNotices`;
		} else if (type === 3) {
			keyStr = `${userId}_coupon`;
		}
		await localForage.getItem(keyStr).then((value) => {
			// 当离线仓库中的值被载入时，此处代码运行
			// console.log('indexDBMsgList: ', value);
			if (value && value.length > 0) {
				indexDBMsgList = value;
			}
			indexDBMsgList.push(obj);
			localForage.setItem(keyStr, indexDBMsgList).then((value) => {
				// console.log(value);
			}).catch((err) => {
				console.log(err);
			});
		}).catch((err) => {
			console.log(err);
		});
	},
	/**
	 * 存储-未读的-聊天消息
	 * 未读消息: 存储到本地 - 未读的 "聊天消息" (mgsAllIdsOutline)
	 * @param {Object} obj 要存储的某条信息
	 * @param {Object} fromId 聊天对象的id
	 * @param {Object} userId 本人id
	 */
	async doLocalForageOutline(obj, fromId, userId) {
		let indexDBMsgList = [];
		let mgsAllIdsOutline = [];
		localForage.getItem('mgsAllIdsOutline').then((value) => {
			if (value) {
				mgsAllIdsOutline = value;
			}
			if (mgsAllIdsOutline.indexOf(`outline_${fromId},${userId}`) === -1) { // 存储新的聊天对象
				mgsAllIdsOutline.push(`outline_${fromId},${userId}`);
				localForage.setItem('mgsAllIdsOutline', mgsAllIdsOutline);
			}
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
		await localForage.getItem(`outline_${fromId},${userId}`).then((value) => { // 获取已存储的聊天内容,再加入新的聊天信息
			if (value && value.length > 0) {
				indexDBMsgList = value;
			}
			indexDBMsgList.push(obj);
			localForage.setItem(`outline_${fromId},${userId}`, indexDBMsgList).then((value) => {
				// 当值被存储后，可执行其他操作
				// console.log(value);
			}).catch((err) => {
				// 当出错时，此处代码运行
				console.log(err);
			});
		}).catch((err) => {
			// 当出错时，此处代码运行
			console.log(err);
		});
	},
	/**
	 * 存储-未读的-其他消息
	 * 未读消息: 存储到本地 - 未读的除聊天消息外的 "其他消息"
	 * @param {Object} obj 要存储的某条信息
	 * @param {Object} type 区分哪种消息 [ 1 - 系统；2 - 征订；3 - 优惠；4 - 评论点赞；5 - 解答回复 ]
	 * @param {Object} userId 本人id
	 */
	async doLocalForageOutline2 (obj, type = 1, userId) {
		let indexDBMsgList = [];
		let keyStr = `${userId}_notices_outline`; // 系统
		if (type === 2) { // 征订
			keyStr = `${userId}_overprintNotices_outline`;
		} else if (type === 3) { // 优惠
			keyStr = `${userId}_coupon_outline`;
		} else if (type === 4) { // 评论点赞
			keyStr = `${userId}_trends_outline`;
		} else if (type === 5) { // 评论点赞
			keyStr = `${userId}_question_outline`;
		}
		await localForage.getItem(keyStr).then((value) => {
			if (value && value.length > 0) {
				indexDBMsgList = value;
			}
			indexDBMsgList.push(obj);
			localForage.setItem(keyStr, indexDBMsgList).then((value) => {
				// console.log(value);
			}).catch((err) => {
				console.log(err);
			});
		}).catch((err) => {
			console.log(err);
		});
	},
	/**
	 * 获取 - 评论点赞 未读信息个数
	 * @param {Object} vm
	 * computed: userInfo
	 * 返回 数量
	 */
	async getTrendMsgsUnreadMsgNum (vm) {
		let a = [];
		await localForage.getItem(`${vm.userInfo.userId}_trends_outline`).then((value) => {
			if (value && value.length > 0) {
				a = value;
			// 	this.navList.splice(0, 1, {
			// 		text: '动态',
			// 		num: value.length
			// 	});
			// 	this.setUnreadMsg(this.unreadMsg + value.length);
			// } else {
			// 	this.navList.splice(0, 1, {
			// 		text: '动态',
			// 		num: 0
			// 	});
			}
		}).catch((err) => {
			console.log(err);
		});
		return a.length;
	},
	/**
	 * 获取 - 解答回复 未读信息个数
	 * @param {Object} vm
	 * computed: userInfo
	 * 返回 数量
	 */
	async getQuestionMsgsUnreadMsgNum (vm) {
		let a = [];
		await localForage.getItem(`${vm.userInfo.userId}_question_outline`).then((value) => {
			if (value && value.length > 0) {
				a = value;
			}
		}).catch((err) => {
			console.log(err);
		});
		return a.length;
	},
	/**
	 * 获取 - 系统通知+优惠券+征订需求 未读信息个数
	 * @param {Object} vm
	 * @param {Object} from_allNotice 页面是否定义有三个菜单栏的数据list, 字段名固定见下方data说明
	 * computed: userInfo
	 * data: sysnoticeList \ printmsgList \ couponList
	 * 返回 数量
	 */
	async getNoticesUnreadMsgNum (vm, from_allNotice) {
		let s = 0;
		await localForage.getItem(`${vm.userInfo.userId}_notices_outline`).then((value) => {
			if (value && value.length > 0) {
				s += value.length;
				if (from_allNotice) {
					let list = vm.sysnoticeList.concat(value);
					vm.sysnoticeList = list;
				}
			}
		}).catch((err) => {
			console.log(err);
		});
		await localForage.getItem(`${vm.userInfo.userId}_overprintNotices_outline`).then((value) => {
			if (value && value.length > 0) {
				s += value.length;
				if (from_allNotice) {
					let list = vm.printmsgList.concat(value);
					vm.printmsgList = list;
				}
			}
		}).catch((err) => {
			console.log(err);
		});
		await localForage.getItem(`${vm.userInfo.userId}_coupon_outline`).then((value) => {
			if (value && value.length > 0) {
				s += value.length;
				if (from_allNotice) {
					let list = vm.couponList.concat(value);
					vm.couponList = list;
				}
			}
		}).catch((err) => {
			console.log(err);
		});
		return s;
	},
	/**
	 * 获取 - 聊天信息 未读信息个数
	 * @param {Object} vm
	 * @param {Object} from_allNotice 页面有区别于store里的客服列表字段, 字段名固定见下方data说明
	 * computed: userInfo / chatList
	 * data: pageChatList
	 * 返回 数量
	 */
	async getChatMsgUnreadMsgNum (vm, from_allNotice) {
		let s = 0;
		let mgsAllIdsOutlineList = [];
		await localForage.getItem('mgsAllIdsOutline').then((value) => {
			if (value) {
				mgsAllIdsOutlineList = value;
			}
		}).catch((err) => {
			console.log(err);
		});
		if (from_allNotice) {
			for (let v of vm.pageChatList) {
				if (mgsAllIdsOutlineList.indexOf(`outline_${v.uid},${vm.userInfo.userId}`) !== -1) {
					await localForage.getItem(`outline_${v.uid},${vm.userInfo.userId}`).then((value) => {
						if (value && value.length > 0) {
							v._msgNum = value.length;
							v._msgTime = value[value.length - 1]['time'];
							s += value.length;
						}
					}).catch((err) => {
						console.log(err);
					});
				}
			}
		} else {
			for (let v of vm.chatList) {
				if (mgsAllIdsOutlineList.indexOf(`outline_${v.uid},${vm.userInfo.userId}`) !== -1) {
					await localForage.getItem(`outline_${v.uid},${vm.userInfo.userId}`).then((value) => {
						if (value && value.length > 0) {
							s += value.length;
						}
					}).catch((err) => {
						console.log(err);
					});
				}
			}
		}
		return s;
	},
	/**
	 * 设置TabBar数字角标值
	 * @param {Object} vm
	 * computed: userInfo / chatList
	 * methods: setUnreadMsg
	 */
	async setUnreadMsgAll (vm) {
		let a1, a2, a3, a4;
		// a1 = await this.getTrendMsgsUnreadMsgNum(vm);
		a4 = await this.getQuestionMsgsUnreadMsgNum(vm);
		a2 = await this.getNoticesUnreadMsgNum(vm);
		a3 = await this.getChatMsgUnreadMsgNum(vm);
		// let s = a1 + a2 + a3;
		let s = a4 + a2 + a3;
		vm.setUnreadMsg(s);
	},
	
	
	
	async getNoticeUnreadMsg (userId, vm) {
		let s = 0;
		await localForage.getItem(`${userId}_notices_outline`).then((value) => {
			console.log('getIndexDBMsg: ', value);
			if (value && value.length > 0) {
				s += value.length;
			}
		}).catch((err) => {
			console.log(err);
		});
		await localForage.getItem(`${userId}_overprintNotices_outline`).then((value) => {
			console.log('getIndexDBMsg: ', value);
			if (value && value.length > 0) {
				s += value.length;
			}
		}).catch((err) => {
			console.log(err);
		});
		await localForage.getItem(`${userId}_coupon_outline`).then((value) => {
			console.log('getIndexDBMsg: ', value);
			if (value && value.length > 0) {
				s += value.length;
			}
		}).catch((err) => {
			console.log(err);
		});
		vm.setUnreadMsg(s);
	},
	

	
	
	/**
	 * 查看未读消息
	 * @param {Object} vm
	 * 需要vue页面必须有:
	 * 字段: chatList / userInfo / unreadMsg
	 * 方法: setUnreadMsg / 
	 */ 
	async getIndexDBMsg2 (vm) {
		let mgsAllIdsOutlineList = [];
		await localForage.getItem('mgsAllIdsOutline').then((value) => {
			if (value) {
				mgsAllIdsOutlineList = value;
			}
		}).catch((err) => {
			console.log(err);
		});
		for (let v of vm.chatList) {
			if (mgsAllIdsOutlineList.indexOf(`outline_${v.uid},${vm.userInfo.userId}`) !== -1) {
				await localForage.getItem(`outline_${v.uid},${vm.userInfo.userId}`).then((value) => {
					if (value && value.length > 0) {
						v._msgNum = value.length;
						vm.setUnreadMsg(vm.unreadMsg + value.length);
					}
				}).catch((err) => {
					console.log(err);
				});
			}
		}
	}
}